<?
/**
 * This file is part of XNAT light.
 *
 * XNAT light is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * XNAT light is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with XNAT light.  If not, see <http://www.gnu.org/licenses/>.
 */
namespace NRG\System;

/**
 * Filesystem  model
 *
 * @package NRG\System
 */
class Filesystem
{
    /**
     * Set a lock on the filesystem
     *
     * @param string $file Lock file name
     * @return handle
     */
    public static function setLock($file)
    {
	if(!is_string($file))
	    throw new \Exception("Lockfile cannot be null.");

	if(!$fp = @fopen($file, 'w'))
	    throw new \Exception("Could not open handle on lockfile handle on: $file");

	if(flock($fp, LOCK_EX | LOCK_NB))
	    return $fp;
	else
	    throw new \Exception("Established a handle, but could not place lock on lockfile: $file");
    }

    /**
     * Release lock set on file handle
     *
     * @param handle $ptr File handle
     * @return boolean
     */
    public static function unlock($ptr)
    {
	if(!$ptr)
	    throw new \Exception("Lockfile pointer cannot be null");

	if(!flock($ptr, LOCK_UN))
	    throw new \Exception("Could not unlock lockfile: $ptr");

	if(!fclose($ptr))
	    throw new \Exception("Coud not close handle on lockfile: $ptr");

	return true;
    }
}
